{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 一.基本思路：保持局部线性关系\n",
    "上一节介绍了Isomap，它的目的是维持流形中各个点之间距离一致性，我们将每个数据看做空间中的一个点，每个点与其近邻点间的距离为其欧氏距离，而其他非近邻点的点距离为无穷大，为了求解该点与非近邻点之间的距离，我们使用floyd算法求解它们之间的最短距离作为替代，而floyd算法的使用使得算法复杂度提升很多。而局部线性嵌入(Locally Linear Embedding，LLE)仅考虑了近邻点之间的线性关系，而不考虑某点与其非近邻点之间的关系，这极大的降低了算法复杂度，便于对海量数据的降维，下面介绍其基本思路\n",
    "![avatar](./source/19_lle1.png)\n",
    "根据上图进行介绍，大致分为三个部分：   \n",
    "\n",
    "（1）确定$k$：确定近邻点数量$k$（类似于knn/kmeans中k的选择），这里我们选择$k=3$；  \n",
    "（2）计算系数矩阵$W$：对于高维空间中的一点$x_i$，我们知道它的最近邻的三个点为$x_j,x_k,x_l$，这一步便是寻找三个系数$w_{ij},w_{ik},w_{il}$使得如下等式成立或者近似：   \n",
    "\n",
    "$$\n",
    "x_i=w_{ij}x_j+w_{ik}x_k+w_{il}x_l\n",
    "$$  \n",
    "(3)寻找$x_i,x_j,x_k,x_l$在低维空间中的点$z_i,z_j,z_k,z_l$，使其也满足上面的关系：   \n",
    "\n",
    "$$\n",
    "z_i=w_{ij}z_j+w_{ik}z_k+w_{il}z_l\n",
    "$$  \n",
    "\n",
    "假设高维空间样本集为$X\\in R^{m\\times n}$，系数矩阵为$W\\in R^{m\\times m}$，对应的低维空间样本集为$Z\\in R^{m\\times d}$，根据上面的介绍，计算流程如下：   \n",
    "\n",
    "$$\n",
    "X\\rightarrow W\\rightarrow Z\n",
    "$$  \n",
    "我们接下来对其进行推导\n",
    "\n",
    "#### $X\\rightarrow W$\n",
    "\n",
    "我们假设每个样本点$x_i$对应的近邻下标集合为$Q_i$，那么对于$W$的求解，等价于如下的优化问题   \n",
    "\n",
    "$$\n",
    "\\min_{w_1,w_2,...,w_m}\\sum_{i=1}^m\\left|\\left|x_i-\\sum_{j\\in Q_i}w_{ij}x_j\\right|\\right|_2^2\\\\\n",
    "s.t.\\left\\{\\begin{matrix}\n",
    "j\\in Q_i & w_{ij}\\geq0\\\\ \n",
    "j\\notin Q_i & w_{ij}=0\n",
    "\\end{matrix}\\right.\\\\\n",
    "\\sum_{j=1}^mw_{ij}=1\n",
    "$$  \n",
    "\n",
    "这是一个带约束的凸优化问题，我们可以通过KKT条件进行求解，令$C_{jk}^i=(x_i-x_j)^T(x_i-x_k)$，那么：   \n",
    "\n",
    "$$\n",
    "    w_{ij}=\\frac{\\sum_{k\\in Q_i}\\frac{1}{C_{jk}^i}}{\\sum_{l\\in Q_i}\\sum_{s\\in Q_i}\\frac{1}{C_{ls}^i}}\n",
    "$$  \n",
    "\n",
    "#### $W\\rightarrow Z$\n",
    "对于低维空间样本点的求解，可以转换为类似的优化问题（并希望各样本之间正交）\n",
    "\n",
    "$$\n",
    "\\min_{z_1,z_2,...,z_m}\\sum_{i=1}^m\\left|\\left|z_i-\\sum_{j\\in Q_i}w_{ij}z_j\\right|\\right|_2^2\\\\\n",
    "s.t.\\left\\{\\begin{matrix}\n",
    "z_i^Tz_j=1 & i=j\\\\ \n",
    "z_i^Tz_j=0 & i\\neq j\n",
    "\\end{matrix}\\right.\\\\\n",
    "$$   \n",
    "\n",
    "我们令$M=(I-W)^T(I-W)$，上式可以简化为   \n",
    "\n",
    "$$\n",
    "\\min_Z tr(ZMZ^T)\\\\\n",
    "s.t. ZZ^T=I\n",
    "$$  \n",
    "\n",
    "所以，我们只需要对$M$做特征分解，并去最小的$d$个特征值对应的特征向量组成的矩阵，即是$Z$\n",
    "\n",
    "### 二.代码实现"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from matplotlib import pyplot as plt\n",
    "from mpl_toolkits.mplot3d import Axes3D\n",
    "import numpy as np\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "#伪数据\n",
    "n = 200\n",
    "r = np.linspace(0,1,n)\n",
    "l = np.linspace(0,1,n)\n",
    "\n",
    "t = (3 * np.pi) / 2 * ( 1 + 2 * r )\n",
    "x =  t * np.cos(t)\n",
    "y = 10 * l\n",
    "z =t * np.sin(t)\n",
    "data=np.c_[x,y,z]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1833329ad68>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure()\n",
    "ax1 = plt.axes(projection='3d')\n",
    "ax1.scatter3D(data[:,0],data[:,1],data[:,2], cmap='Blues')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(200, 3)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "#构建距离矩阵\n",
    "m=data.shape[0]\n",
    "D=np.zeros(shape=(m,m))\n",
    "for i in range(0,m):\n",
    "    for j in range(i,m):\n",
    "        D[i,j]=np.sqrt(np.sum(np.power(data[i]-data[j],2)))\n",
    "        D[j,i]=D[i,j]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "#保留最近的k个坐标\n",
    "k=3\n",
    "idx=[]\n",
    "for i in range(0,n):\n",
    "    idx.append(np.argsort(D[i])[1:k+1].tolist())#最近的肯定是自身，所以下标从1开始"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "#构建权重矩阵W\n",
    "C=np.zeros(shape=(n,k,k))#辅助计算W\n",
    "W=np.zeros(shape=(n,n))\n",
    "for i in range(0,n):\n",
    "    nn_idx=idx[i]#Q_i\n",
    "    for cj1 in range(0,k):\n",
    "        for cj2 in range(cj1,k):\n",
    "            j1=nn_idx[cj1]\n",
    "            j2=nn_idx[cj2]\n",
    "            c=np.dot(data[i]-data[j1],data[i]-data[j2])\n",
    "            c=1.0/c\n",
    "            C[i,cj1,cj2]=c\n",
    "            C[i,cj2,cj1]=c"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "C=np.sum(C,axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "C=C/np.sum(C,axis=1,keepdims=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "for i in range(0,n):\n",
    "    nn_idx=idx[i]\n",
    "    for cj in range(0,k):\n",
    "        W[i,nn_idx[cj]]=C[i,cj]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "#对M特征分解\n",
    "M=(np.eye(n)-W).T.dot(np.eye(n)-W)\n",
    "eig_vals,eig_vecs=np.linalg.eig(M)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "sorted_indice=np.argsort(eig_vals.real)\n",
    "eig_vals=eig_vals[sorted_indice]\n",
    "eig_vecs[:]=eig_vecs[:,sorted_indice]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "#保留前2维\n",
    "n_compnent=2\n",
    "new_data=eig_vecs.real[:,:n_compnent]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x183353f00b8>"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYoAAAD8CAYAAABpcuN4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAEPZJREFUeJzt3X2MXFd5x/HvEy82ryGx44TUjmtHGKFUvLRsHSoBBUKCqSimaiIMgRopkUVb/qj6JqMIEKZRCa0ERVCBKUEGCZw0/IFLXSwTXoQqGryGxI1DUzsuJJtYiRMnEPES4/D0jzmbDJOZs7u+154Z+/uRRjv33HPOfXT3zvx27tyZjcxEkqRBzhh2AZKk0WZQSJKqDApJUpVBIUmqMigkSVUGhSSpyqCQJFUZFJKkKoNCklQ1MewCjsc555yTK1euHHYZkjRW9uzZ82BmLp3vuLEMipUrVzI1NTXsMiRprETEj45nnKeeJElVBoUkqcqgkCRVGRSSpCqDQpJUZVBIkqoMCklSlUEhSaoyKCRJVQaFJKnKoJAkVRkUkqQqg0KSVGVQSJKqDApJUpVBIUmqaiUoImJtRNwZEQciYlOf9a+KiO9FxLGIuLxn3YaI2F9uG9qoR5LUnsb/4S4iFgCfAC4FpoHdEbE9M+/o6nY38E7gr3vGLgbeD0wCCewpYx9uWpd0Ml187S7uf/ToE8vnPWcht1xz6RArktrTxiuKNcCBzDyYmUeBbcC67g6Z+cPM3Av8qmfs64FdmXmkhMMuYG0LNUknTW9IANz/6FEuvnbXkCqS2tVGUCwD7ulani5tJ3qsNBJ6Q2K2dmnctBEU0act2x4bERsjYioipg4fPjzn4iRJzbQRFNPABV3Ly4H72h6bmVsyczIzJ5cuXXpchUqS5q+NoNgNrI6IVRGxEFgPbJ/j2J3AZRFxdkScDVxW2iRJI6JxUGTmMeDddJ7gfwDcmJn7ImJzRLwJICJ+NyKmgSuAT0XEvjL2CPBBOmGzG9hc2iRJI6Lx5bEAmbkD2NHT9r6u+7vpnFbqN/Z64Po26pAktc9PZkuSqgwKSVKVQSFJqjIoJElVBoUkqcqgkCRVGRSSpCqDQpJUZVBIkqoMCklSlUEhSaoyKCRJVQaFJKnKoJAkVRkUkqQqg0KSVGVQSJKqDApJUpVBIUmqMigkSVUGhSSpyqCQJFUZFJKkKoNCklRlUEiSqgwKSVKVQSFJqjIoJElVBoUkqcqgkCRVGRSSpCqDQpJUZVBIkqoMCklSlUEhSapqJSgiYm1E3BkRByJiU5/1iyLihrL+lohYWdpXRsTPI+LWcvtkG/VIktoz0XSCiFgAfAK4FJgGdkfE9sy8o6vbVcDDmfn8iFgPXAe8pay7KzNf2rQOSdKJ0cYrijXAgcw8mJlHgW3Aup4+64Ct5f5NwCURES1sW5J0grURFMuAe7qWp0tb3z6ZeQz4MbCkrFsVEd+PiG9FxCsHbSQiNkbEVERMHT58uIWyJUlz0UZQ9HtlkHPscwhYkZm/Dfwl8IWIOLPfRjJzS2ZOZubk0qVLGxUsSZq7NoJiGriga3k5cN+gPhExATwXOJKZj2XmQwCZuQe4C3hBCzVJklrSRlDsBlZHxKqIWAisB7b39NkObCj3Lwe+npkZEUvLm+FExIXAauBgCzVJklrS+KqnzDwWEe8GdgILgOszc19EbAamMnM78Bng8xFxADhCJ0wAXgVsjohjwOPAuzLzSNOaJEntaRwUAJm5A9jR0/a+rvu/AK7oM+5LwJfaqEGSdGL4yWxJUpVBIUmqMigkSVUGhSSpyqCQJFUZFJKkKoNCklRlUEiSqgwKSVKVQSFJqjIoJElVBoUkqcqgkCRVGRSSpCqDQpJUZVBIkqoMCklSlUEhSaoyKCRJVQaFJKnKoJAkVRkUkqQqg0KSVGVQSJKqDAqpoZhnuzRuDAqpoZxnuzRuDApJUpVBIUmqMiikhhYu6P9uxKB2adwYFFJDv/xV/3cjBrVL48agkBrKAXkwqF0aNwaFJKnKoJAkVRkUkqSqVoIiItZGxJ0RcSAiNvVZvygibijrb4mIlV3r3lPa74yI17dRjySpPY2DIiIWAJ8A3gBcBLw1Ii7q6XYV8HBmPh/4CHBdGXsRsB74LWAt8M9lPknSiGjjFcUa4EBmHszMo8A2YF1Pn3XA1nL/JuCSiIjSvi0zH8vM/wMOlPkkSSOijaBYBtzTtTxd2vr2ycxjwI+BJXMcK420ZWc9Y17t0rhpIyj6ffy09wryQX3mMrYzQcTGiJiKiKnDhw/Ps0TpxHnNC5fOq10aN20ExTRwQdfycuC+QX0iYgJ4LnBkjmMByMwtmTmZmZNLl/oA1Oj4ym2H5tUujZs2gmI3sDoiVkXEQjpvTm/v6bMd2FDuXw58PTOztK8vV0WtAlYD322hJumkeeTnv5xXuzRuJppOkJnHIuLdwE5gAXB9Zu6LiM3AVGZuBz4DfD4iDtB5JbG+jN0XETcCdwDHgD/PzMeb1iRJak/joADIzB3Ajp6293Xd/wVwxYCx1wLXtlGHNAxnBPT7/r8z/PJYnSL8ZLbU0KAvifXLY3WqMCgkSVUGhSSpyqCQGhr0VoRvUehUYVBIDQ16K8K3KHSqMCgkSVUGhSSpyqCQJFUZFJKkKoNCklRlUEiSqgwKSVKVQSFJqjIopIb8ZLZOdQaF1JCfzNapzqCQJFUZFJKkKoNCklRlUEiSqgwKSVKVQSFJqjIoJElVBoUkqcqgkCRVGRSSpCqDQpJUZVBIkqoMCqkhvz1WpzqDQmrIb4/Vqc6gkCRVGRSSpCqDQpJUZVBIkqoMCklSlUEhSapqFBQRsTgidkXE/vLz7AH9NpQ++yNiQ1f7NyPizoi4tdzObVKPJKl9TV9RbAJuzszVwM1l+ddExGLg/cDFwBrg/T2BcmVmvrTcHmhYjySpZU2DYh2wtdzfCry5T5/XA7sy80hmPgzsAtY23K4k6SRpGhTnZeYhgPKz36mjZcA9XcvTpW3GZ8tpp/dGhN96IEkjZmK2DhHxNeB5fVZdM8dt9Hvyn/l2gysz896IeA7wJeAdwOcG1LER2AiwYsWKOW5aktTUrEGRma8btC4i7o+I8zPzUEScD/R7j2EaeHXX8nLgm2Xue8vPRyPiC3Tew+gbFJm5BdgCMDk56dfoSNJJ0vTU03Zg5iqmDcCX+/TZCVwWEWeXN7EvA3ZGxEREnAMQEU8D3gjc3rAeSVLLmgbFh4BLI2I/cGlZJiImI+JfADLzCPBBYHe5bS5ti+gExl7gVuBe4NMN65EktWzWU081mfkQcEmf9ing6q7l64Hre/r8FHhZk+1Lkk48P5ktSaoyKCRJVQaFJKnKoJAkVRkUkqQqg0KSVGVQSJKqDApJUpVBIUmqMigkSVUGhSSpyqCQJFUZFJKkKoNCklRlUEiSqgwKSVKVQSFJqjIoJElVBoUkqcqgkCRVGRSSpCqDQpJUZVBIkqoMCklSlUEhSaoyKCRJVQaFJKnKoJAkVRkUkqQqg0KSVGVQSJKqDApJUpVBIUmqMigkSVUGhSSpqlFQRMTiiNgVEfvLz7MH9PtqRDwSEV/paV8VEbeU8TdExMIm9UiS2tf0FcUm4ObMXA3cXJb7+QfgHX3arwM+UsY/DFzVsB5JUsuaBsU6YGu5vxV4c79OmXkz8Gh3W0QE8FrgptnGS5KGp2lQnJeZhwDKz3PnMXYJ8EhmHivL08CyhvVIklo2MVuHiPga8Lw+q65puO3o05aVOjYCGwFWrFjRcNOSpLmaNSgy83WD1kXE/RFxfmYeiojzgQfmse0HgbMiYqK8qlgO3FepYwuwBWBycnJgoEgn25mLFvCTxx7v2y6dCpqeetoObCj3NwBfnuvAzEzgG8DlxzNeGhV7P7D2KaFw5qIF7P3A2iFVJLUrOs/Xxzk4YglwI7ACuBu4IjOPRMQk8K7MvLr0+zbwQuDZwEPAVZm5MyIuBLYBi4HvA2/PzMdm2+7k5GROTU0dd92SdDqKiD2ZOTnfcbOeeqrJzIeAS/q0TwFXdy2/csD4g8CaJjVIkk4sP5ktSaoyKCRJVQaFJKnKoJAkVRkUkqQqg0KSVGVQSJKqDApJUpVBIUmqMigkSVUGhSSpyqCQJFUZFJKkKoNCklRlUEiSqgwKSVJVo/9wNywRcRj40Unc5Dl0/sf3qBuXOmF8arXO9o1LreNSJ8y91t/MzKXznXwsg+Jki4ip4/n3gSfbuNQJ41OrdbZvXGodlzrhxNfqqSdJUpVBIUmqMijmZsuwC5ijcakTxqdW62zfuNQ6LnXCCa7V9ygkSVW+opAk1WXmKX8D1gJ3AgeATX3WLwJuKOtvAVZ2rXsx8B1gH/DfwNOBZwL/DvxPaf9QV/93AoeBW8vt6mHVWdq/Weacqefc2eYa0j59TleNt9K51O+jw9qnwJU99fwKeGlZ97JS9wHgYzz5ynwxsAvYX36efTL26aBaR+04nWWfjtRxWtmno3acPg3YWo7HHwDvmW1OYFWZY3+Zc+Gs9c1np4/jDVgA3AVcCCwEbgMu6unzZ8Any/31wA3l/gSwF3hJWV5S5nsm8JrSthD4NvCGroPl46NQZ9cDcLLP9vrONcxae8bvAV41rH3a0+dFwMGu5e8CvwcE8B9dv/sPzzwggU3AdcOsddSO01n26Ugdp7VaR+k4Bd4GbOv6ff8QWFmbE7gRWF/ufxL409lqPB1OPa0BDmTmwcw8CmwD1vX0WUcnlQFuAi6JiAAuA/Zm5m0AmflQZj6emT/LzG+UtqPA94Dlo1bnLNsbNNfQa42I1cC5dJ7YmmhSZ7e3Al8stZ0PnJmZ38nOI+1zwJv7zLW1q30otY7gcdq3zlkM6zidtdYROU4TeFZETADPAI4CPxk0Zxnz2jIHzPE4PR2CYhlwT9fydGnr2yczjwE/pvOX7guAjIidEfG9iPjb3skj4izgD4Gbu5r/OCL2RsRNEXHBCNT52Yi4NSLe2/UgGDTXsGuFzgPzhvJEPONk79Nub+HJJ4plZZ5+c56XmYfKXIfoPInM1Ymo9QkjcpzOVucoHaez1QqjcZzeBPwUOATcDfxjZh6pzLkEeKTMMWhbT3E6BEW/vz56L/Ua1GcCeAWd85WvAP4oIi55YlAnxb8IfCwzD5bmf6Nz/vDFwNd48q+AYdV5ZWa+CHhlub1jHts72bXOWM+vPzCHsU87KyMuBn6WmbfPY87jcSJqnWkfleO0VueoHae1WmeMwnG6Bngc+A067z38VURcWOl/XPvzdAiKaaA72ZcD9w3qUx5UzwWOlPZvZeaDmfkzYAfwO13jtgD7M/OjMw3lVMpjZfHTdN74HFqdmXlv+fko8AU6B1ZtrqHVWvq+BJjIzD0zbUPapzN6nwym+fXTN91z3l9OTc2conpgjnWeqFpnjMpxOrDOETxOB9Za+o7Kcfo24KuZ+cvMfAD4T2CyMueDwFlljkHbeorTISh2A6sjYlVELKTzi9/e02c7sKHcvxz4enk5uRN4cUQ8s+zY3wfuAIiIv6Pzy/qL7olmniiKN9G5EmEodUbEREScU+p6GvBG4PZZ5hpKrV3jnnI+eEj7lIg4A7iCzvld4IlTSo9GxMvL6ZE/Ab7cZ64NXe1DqbW0j9Jx2rfOET1OB+7TYlSO07uB10bHs4CX07nKre+cZcw3yhww1+N0tne7T4Ub8AfA/9K5CuCa0rYZeFO5/3TgX+lcRvZd4MKusW+nc2nh7cCHS9tyOi/XfkDPpXDA35f+t5VfyAuHWOez6FyVsbes+yeevBpq4FzDqLVr3cHefTbEffpq4L/6zDlZar8L+DhPXh67hM57APvLz8UncZ8+pdYRPU771Tmqx2nf3/8oHafAs0v7Pjp/cP1Nbc7SfmGZ40AZu2i2+vxktiSp6nQ49SRJasCgkCRVGRSSpCqDQpJUZVBIkqoMCklSlUEhSaoyKCRJVf8PY85F9TWfwpMAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1833537acc0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(new_data[:,0],new_data[:,1])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "直观来看，把曲线掰直了！！！，代码封装到`ml_models.decomposition.LLE`中"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
